iOS适配国际化(跟随系统切换和应用内切换)

在开发中我们的APP可能会有海外的版本,可能APP需要匹配英语,俄语,日语等等,这个时候就要做国际化的匹配处理,但是国际化适配也分两种情况,一种是根据iPhone系统语言自动切换界面语言,另外一种是在APP内选择语言,直接刷新APP的界面。下面我会分别介绍这两种情况。Demo在这里

第一种情况,比较简单的跟随系统语言自动切换。这种情况主要使用的是系统提供给我们的一个宏

1
2
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]

key的作用是去localizable.strings文件里面根据这个key去匹配文本内容,然后返回。如果用了这个宏,因为实际上调用的是 [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil] 这个方法,table为nil代表默认去Localizable.strings里面找,所以当创建strings文件的时候命名必须为Localizable,如果strings命名为其他名字,那么要用 #define NSLocalizedStringFromTable(key, tbl, comment)指定table的名字为strings的文件名字。
以上是基本的介绍。

下面开始说说开发步骤:

1.首先需要在项目中增加需要匹配的语言

WX20170608-104014.png

如我需要匹配的语言是简体中文和英语。
2.创建Localizable.strings文件

WX20170608-104053.png
创建完成后点击该文件,然后在右侧面板的点击Localization 选择English和Chinese,然后就会生成以下两个文件
WX20170608-104133.png

Localizable.strings(English)代表当系统语言是中文的时候,会来到这个文件根据key匹配text

Localizable.strings(Simplified)代表当系统语言是英文的时候,会来到这个文件根据key匹配text。

以下是两个文件的内容:

Localizable.strings(English)

1
2
"LoginButtonText"="Login";
"LabelText"="The language of System is English now";

Localizable.strings(Chinese(simplified))

1
2
"LoginButtonText"="登陆";
"LabelText"="现在系统的语言是中文";

3.使用NSLocalizedString(key,comment) 宏来赋值
在前面已经说了这个宏的作用了,在我的demo中我给button和label设置text。

1
2
[button setTitle:NSLocalizedString(@"LoginButtonText", @"") forState:UIControlStateNormal];
label.text = NSLocalizedString(@"LabelText", @"");

最后去设置里面切换语言就能看到效果。

第二种情况,像微博或者微信可以在应用的语言设置里面直接设置本APP的语言,这种设置不会影响其他APP,只是本APP的一种行为,主要是利用NSUserDefault来保存本地自定的语言的值,如en,zh-hans等,然后通过读取这个值来加载对应的lproj文件,然后再生成对应的bundle,每个bundle下面就会放着每个table的stings文件。

话不多说,以下是开发步骤:

1.和第一种情况一样,首先需要在项目中增加需要匹配的语言
WX20170608-104014.png

2.创建.strings文件,这里和第一种情况不太一样的是,这里你可以任意指定一个名字,如FirstTabBarItem.strings 来放置tabbar的第一个item的多语言文件,SecondTabBarItem.strings 来放置tabbar的第二个item的多语言文件,这里可以灵活处理。创建完strings文件之后,还是和之前一样点击Localization。然后选择你要适配的语言,生成文件。

3.第三步创建一个LocalizableHelper 的类,这个类的作用是提供一个让外界根据key和table来获取文本的宏,当设置成功之后就会发出一个通知,接受者只需要监听这个通知然后更新必要界面就可以了。具体请看demo,里面已经写了所有步骤的注释。

-------评论系统采用disqus,如果看不到需要翻墙-------------